/** Fichier définissant une forme avec une surface définie par une équation du
 * 4ème degré.
 *
 * Ce fichier contient la définition de la classe Tricurte.
 *
 * @file Tricurte.hpp
 * @author Johan "Solo" Luisier
 * @date 20 Février 2013
 */
#ifndef TRICURTE_HPP
#define TRICURTE_HPP

#include "Forme.hpp"

/** Class qui implémente la "tricurte", une surface décrite par une
 * équation du 4ème degré.
 *
 * Le mot tricurte est un néologisme personnel formé du grec
 * @f$\tau\rho\epsilon\tilde{\iota}\zeta@f$ (trois) et
 * @f$\kappa\nu\rho\acute{o}\zeta@f$ (courbe). En effet la figure
 * formée est équivalente à une sphère à @e trois anses.
 *
 * La surface est décrite par l'équation :
 * @f[ \big( x^2 + y^2 + z^2 - \alpha \, \kappa^2 \big)^2 - b \,
 * \left( \left( z - \kappa \right)^2 - 2 \, x^2 \left) \, \left(
 * \right( z + \kappa \right)^2 - 2 \, y^2 \right) = 0 @f]
 *
 * @author Johan "Solo" Luisier
 * @date 20 Février 2013
 */
class Tricurte : public Forme
{
public:
  Tricurte();
  virtual ~Tricurte();
  Coord trouveIntersection( const Rayon& ray ) const;
  VecteurU normale( const Coord& pt ) const;
  bool estDans( const Coord& pt ) const;
  bool estSur( const Coord& pt ) const;
  std::ostream& affiche( std::ostream& os ) const;
  Coord intrinseque( const Coord& pt ) const;
protected:
  /**
   */
  double Alpha;
  /**
   */
  double Beta;
  /**
   */
  double Kappa;
};

#endif // TRICURTE_HPP
